package main.leetcode.clockin.Auguest;

/**
 * 201. 数字范围按位与
 *
 * <p>给定范围 [m, n]，其中 0 <= m <= n <= 2147483647，返回此范围内所有数字的按位与（包含 m, n 两端点）。
 *
 * <p>示例 1: 输入: [5,7] 输出: 4
 *
 * <p>示例 2: 输入: [0,1] 输出: 0
 */
public class day23 {
    //    /** 暴力，tle */
    //    public int rangeBitwiseAnd(int m, int n) {
    //        int res = m;
    //        for (int i = m + 1; i <= n; ++i) {
    //            res &= i;
    //        }
    //        return res;
    //    }

    //    /**
    //     * 公共前缀
    //     *
    //     * <p><br>
    //     * 8： 1 0 0 0 <br>
    //     * 9： 1 0 0 1 <br>
    //     * 10: 1 0 1 0 <br>
    //     * ----↑-----------
    //     */
    //    public int rangeBitwiseAnd(int m, int n) {
    //        int res = 0;
    //        while (m != n) {
    //            m >>= 1;
    //            n >>= 1;
    //            ++res;
    //        }
    //        // 请注意是让m左移✔
    //        return m << res;
    //    }

    public int rangeBitwiseAnd(int m, int n) {
        while (m < n) {
            n &= n - 1;
        }
        return n;
    }
}
